package com.szwistar.common.luaj;

import java.net.InetSocketAddress;

import org.apache.mina.filter.codec.ProtocolCodecFilter;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import com.shephertz.appwarp.websocket.binary.WebSocketCodecFactory;
import com.szwistar.common.comm.InetSocketAddressEx;
import com.szwistar.common.comm.ServerBase;

public class LuaRpcServer {
	static final Logger LOG = LoggerFactory.getLogger(LuaRpcServer.class);

    /**
     * 启动服务
     * @param name 服务器名称
     * @param clientContext 上下文
     * @param tcp true 表示使用TCP；false 使用 UDP
     * @param address 地址格式形如："192.168.0.196:9488" / "*:9488"(当地址用做服务器监听地址时，IP地址可以用"*"，表示在所有本地IP地址上监听)
     * @param encode Lua脚本编码格式
     * @param decodingDelimiter Lua脚本结束标志
     * @param encodingDelimiter 执行结果返回时的行结束标志
     * @return
     */
	public static ServerBase<LuaRpcEndpoint> start(String name, Object clientContext, boolean tcp, String address, String encode, String decodingDelimiter, String encodingDelimiter) {
        try {
        	// 创建服务器
        	InetSocketAddress addr = InetSocketAddressEx.fromString(address);
            ServerBase<LuaRpcEndpoint> server = new ServerBase<LuaRpcEndpoint>(name, addr, LuaRpcEndpoint.class, clientContext,	tcp );

            // 设置编解码器
            server.getAcceptor().getFilterChain().addLast("luaRpcCodec", LuaRpcEndpoint.getFilter(encode, decodingDelimiter, encodingDelimiter));

            // 启动服务器
            server.start();
            LOG.debug("启动 LuaRpc 服务器 {}://{} 成功！", tcp?"tcp":"udp", address);
            return server;
        } catch(Exception e) {
            LOG.debug("启动 LuaRpc 服务器 {}://{} 失败！{}", tcp?"tcp":"udp", address, e);
            return null;
        }
	}

    /**
     * 启动WebService服务
     * @param name 服务器名称
     * @param clientContext 上下文
     * @param address 地址格式形如："192.168.0.196:9488" / "*:9488"(当地址用做服务器监听地址时，IP地址可以用"*"，表示在所有本地IP地址上监听)
     * @return
     */
	public static ServerBase<LuaRpcEndpoint> start(String name, Object clientContext, String address) {
        try {
        	// 创建服务器
        	InetSocketAddress addr = InetSocketAddressEx.fromString(address);
            ServerBase<LuaRpcEndpoint> server = new ServerBase<LuaRpcEndpoint>( name, addr, LuaRpcEndpoint.class, clientContext, true );

            // 设置编解码器
            server.getAcceptor().getFilterChain().addFirst("webSocketCodec", new ProtocolCodecFilter(new WebSocketCodecFactory()));

            // 启动服务器
            server.start();
            return server;
        } catch(Exception e) {
            LOG.debug("启动 LuaRpc 服务器 {}://{} 失败！{}", name, address, e);
            return null;
        }
	}
}
